/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package clientesocket;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Leo
 */

/* clase que es utilizada para realizar la carga de archivos, es desde esta clase que 
 * el cliente le envia por socket los archivos al sevidor
 */
public class Carga implements Runnable {

    private Socket cliente;
    private FileInputStream archivo;
    private String ruta;
    private String nombreArchivo;
    private VentanaCliente ventanita;
    private long tamano;
    private int posicion;
    private long cantidadCargada;
    private DataInputStream entrada;
    private DataOutputStream salida;
    private String ip;
    private int posicionVentana;

    public Carga(String ruta, String nombreArchivo, VentanaCliente ventanita, int posicion, long cantidadCargada, String ip, int posicionVentana) {
        this.ruta = ruta;
        this.nombreArchivo = nombreArchivo;
        this.ventanita = ventanita;
        this.posicion = posicion;
        this.cantidadCargada = cantidadCargada;
        this.ip = ip;
        this.posicionVentana = posicionVentana;
    }
    /* metodo utilizado para enviar un archivo al servidor desde cero
     * 
     */
    private void cargarArchivo() {
        long lleva = 0;
        try {
            salida.writeUTF("CARGA");
            salida.writeUTF(ventanita.getUsuario());
            salida.writeUTF(nombreArchivo);

            File f = new File(ruta);
            tamano = f.length();
            salida.writeLong(tamano);
            archivo = new FileInputStream(ruta);

            System.out.println("Iniciando transmision con" + String.valueOf(archivo.getChannel().size()) + " bytes");
            byte[] buffer = new byte[1024];
            int len;
            while ((len = archivo.read(buffer)) > 0) {
                ventanita.actualizarcantidadservidor(posicion, posicionVentana, lleva);
                salida.write(buffer, 0, len);
                lleva = lleva + len;
                ventanita.actualizarcantidadservidor(posicion, posicionVentana, lleva);
            }
            ventanita.actualizarcantidadservidor(posicion, posicionVentana, lleva);
            System.out.println("Fin de envio");
            String cadenaArchivosN = entrada.readUTF();
            ventanita.actualizarcombobox(cadenaArchivosN);
            ventanita.actualizarcantidadservidor(posicion, posicionVentana, lleva);
        } catch (IOException e) {
            System.out.println("se cayo en la carga");
            System.out.println("Creando otro hilo para que continue (carga)");
            Carga hiloCarga = new Carga(ruta, nombreArchivo, ventanita, posicion, lleva, ip, posicionVentana);
            Thread thread = new Thread(hiloCarga);
            thread.start();
            ventanita.actualizarestado("Pausada la Carga", posicion);
        }
    }
    /* metodo utilizado para continuar el envio de un archivo al servidor desde una cantidad 
     * especifica que el servidor le envia al cliente
     */
    private void continuarCargarArchivo() {
        long lleva = cantidadCargada;
        int len = 0;
        try {
            salida.writeUTF("CONTINUAR CARGA");
            salida.writeUTF(ventanita.getUsuario());
            salida.writeUTF(nombreArchivo);

            archivo = new FileInputStream(ruta);
            File f = new File(ruta);
            tamano = f.length();
            salida.writeLong(tamano);

            cantidadCargada = entrada.readLong();

            if (cantidadCargada != 0) {
                archivo.skip(cantidadCargada);
            }

            System.out.println("Iniciando transmision con" + String.valueOf(archivo.getChannel().size()) + " bytes");
            byte[] buffer = new byte[1024];
            ventanita.actualizarestado("Cargando", posicion);
            while ((len = archivo.read(buffer)) > 0) {
                ventanita.actualizarcantidadservidor(posicion, posicionVentana, lleva);
                salida.write(buffer, 0, len);
                lleva = lleva + len;
                ventanita.actualizarcantidadservidor(posicion, posicionVentana, lleva);
            }
            ventanita.actualizarcantidadservidor(posicion, posicionVentana, lleva);
            System.out.println("Fin de envio");
            String cadenaArchivosN = entrada.readUTF();
            ventanita.actualizarcombobox(cadenaArchivosN);
            ventanita.actualizarcantidadservidor(posicion, posicionVentana, lleva);
        } catch (IOException e) {
            System.out.println("se cayo en continuar la carga");
            System.out.println("Creando otro hilo para que continue (continuar carga)");
            ventanita.actualizarcantidadservidor(posicion, posicionVentana, lleva);
            Carga hiloCarga = new Carga(ruta, nombreArchivo, ventanita, posicion, lleva, ip, posicionVentana);
            Thread thread = new Thread(hiloCarga);
            thread.start();
            ventanita.actualizarestado("Pausada la Carga", posicion);
        }
    }
    /* metodo que inicia el hilo de la clase
     * 
     */
    public void run() {
        try {
            cliente = new Socket(ip, Integer.parseInt(VentanaLogin.configuracion.getPuertoLogin()));
            entrada = new DataInputStream(this.cliente.getInputStream());
            salida = new DataOutputStream(this.cliente.getOutputStream());
            //cliente.setSoTimeout(5000);

            if (cantidadCargada == 0) {
                cargarArchivo();
            } else {
                continuarCargarArchivo();
            }
        } catch (UnknownHostException ex) {
            Carga hiloCarga = new Carga(ruta, nombreArchivo, ventanita, posicion, cantidadCargada, ip, posicionVentana);
            Thread thread = new Thread(hiloCarga);
            thread.start();
            System.out.println("Creando otro hilo por primera vez");
        } catch (IOException ex) {
            Carga hiloCarga = new Carga(ruta, nombreArchivo, ventanita, posicion, cantidadCargada, ip, posicionVentana);
            Thread thread = new Thread(hiloCarga);
            thread.start();
            System.out.println("Creando otro hilo por primera vez");
        }
    }
}
